9.9 パニックとリカバリー
Goのランタイムが次に何をすれば良いか判断できない時にpanicが生成される
例えば、スライスの終わりを超えて読み込もうとしたり、makeの引数に負の数字を指定したりするケース
ガベージコレクターの誤動作やランタイム自体のバグを検出した時もpanicになるが、「ランタイムに原因がある」場合は非常に稀なので最後に考える
panicがなった時は第一に「プログラミングのエラーが原因である」ことを疑う
recoverは何が失敗したのかを明示してくれず、メッセージを出力して継続できるだけなので、できる限りpanicやrecoverに依存しないコードを書くよう心がける
panicとrecoverの実装例
code:go
package main
import (
"fmt"
)
func div60(i int) {
defer func() {
if v := recover(); v != nil {
fmt.Println(v)
}
}()
fmt.Println(60 / i)
// 60
// 30
// runtime error: integer divide by zero
// 10
}
func main() {
for _, val := range []int{1, 2, 0, 6} {
div60(val)
}
}